package com.c2b.algorithm.leetcode.base;

import java.util.HashSet;
import java.util.Set;

/**
 * <a href='https://leetcode.cn/problems/find-maximum-number-of-string-pairs/'>最大字符串配对数目(Find Maximum Number of String Pairs)</a>
 * <p>给你一个下标从 0 开始的数组 words ，数组中包含 互不相同 的字符串。</p>
 * <p>
 * 如果字符串 words[i] 与字符串 words[j] 满足以下条件，我们称它们可以匹配：
 *     <ul>
 *         <li>字符串 words[i] 等于 words[j] 的反转字符串。</li>
 *         <li>0 <= i < j < words.length</li>
 *     </ul>
 * </p>
 * <p>请你返回数组 words 中的 最大 匹配数目。</p>
 * <p>注意，每个字符串最多匹配一次。</p>
 *
 * <p>
 * <b>示例</b>
 * <pre>
 * 示例 1：
 *      输入：words = ["cd","ac","dc","ca","zz"]
 *      输出：2
 *      解释：在此示例中，我们可以通过以下方式匹配 2 对字符串：
 *          - 我们将第 0 个字符串与第 2 个字符串匹配，因为 word[0] 的反转字符串是 "dc" 并且等于 words[2]。
 *          - 我们将第 1 个字符串与第 3 个字符串匹配，因为 word[1] 的反转字符串是 "ca" 并且等于 words[3]。
 *          可以证明最多匹配数目是 2 。
 *
 * 示例 2：
 *      输入：words = ["ab","ba","cc"]
 *      输出：1
 *      解释：在此示例中，我们可以通过以下方式匹配 1 对字符串：
 *          - 我们将第 0 个字符串与第 1 个字符串匹配，因为 words[1] 的反转字符串 "ab" 与 words[0] 相等。
 *          可以证明最多匹配数目是 1 。
 *
 * 示例 3：
 *      输入：words = ["aa","ab"]
 *      输出：0
 *      解释：这个例子中，无法匹配任何字符串。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>1 <= words.length <= 50</li>
 *      <li>words[i].length == 2</li>
 *      <li>words 包含的字符串互不相同。</li>
 *      <li>words[i] 只包含小写英文字母。</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/23 11:28
 */
public class LC2744FindMaximumNumberOfStringPairs_S {

    static class Solution {

        public int maximumNumberOfStringPairs(String[] words) {
            Set<Integer> visited = new HashSet<>();
            int res = 0;
            for (String word : words) {
                if (visited.contains(word.charAt(1) * 100 + word.charAt(0))) {
                    ++res;
                }
                visited.add(word.charAt(0) * 100 + word.charAt(1));
            }
            return res;
        }

        public int maximumNumberOfStringPairs2(String[] words) {
            boolean[] flags = new boolean[words.length];
            int res = 0;
            for (int i = 0; i < words.length; i++) {
                for (int j = i + 1; j < words.length; j++) {
                    if (flags[j]) {
                        continue;
                    }
                    if (words[i].charAt(0) == words[j].charAt(1) && words[i].charAt(1) == words[j].charAt(0)) {
                        flags[i] = flags[j] = true;
                        ++res;
                        break;
                    }
                }
            }
            return res;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.maximumNumberOfStringPairs(new String[]{"cd", "ac", "dc", "ca", "zz"}));
        System.out.println(solution.maximumNumberOfStringPairs(new String[]{"ab", "ba", "cc"}));
        System.out.println(solution.maximumNumberOfStringPairs(new String[]{"aa", "ab"}));
    }
}
